﻿using System.Collections.Generic;
using System.Linq;
using Zadani09.db.DAO;
using Zadani09.util;

namespace Zadani09.db.DAOimpl
{

    public class UzivatelDAOmysql : AbstractDAO, IUzivatelDAO
    {
        public UzivatelDAOmysql()
            : base()
        {
        }

        public void delete(string id)
        {
            Uzivatel user = new Uzivatel();
            user.IDUzivatel = uint.Parse(id);
           
            this.delete(user);

        }

        public void create(Uzivatel uzivatel)
        {
            initiateConnection();

            uzivatel.LoginHesloHash = Util.Md5(uzivatel.LoginHesloHash);

            db.Uzivatel.InsertOnSubmit(uzivatel);
            db.SubmitChanges();

            closeConnection();
        }

        public Uzivatel load(string id)
        {
            initiateConnection();

            uint idu = uint.Parse(id);

            var result = from u in db.Uzivatel
                         where u.IDUzivatel == idu
                         select new Uzivatel()
                         {

                             IDUzivatel = u.IDUzivatel,
                             Email = u.Email,
                             LoginUzivatel = u.LoginUzivatel,
                             LoginHesloHash = u.LoginHesloHash,
                             Jmeno = u.Jmeno,
                             Prijmeni = u.Prijmeni,
                             Stav = u.Stav,
                             PosledniZmenaHesla = u.PosledniZmenaHesla,
                             Mesto = u.Mesto,
                             Ulice = u.Ulice,
                             Popisne = u.Popisne,
                             PSC = u.PSC,
                             
                         };


            closeConnection();

            Uzivatel loadedUser = null;

            List<Uzivatel> list = new List<Uzivatel>();

            foreach (var item in result)
            {
                list.Add(item);
            }


            if (list.Count > 1 || list.Count < 1)
            {
                //throw exeption nejakou...
                loadedUser = null;
            }
            else
            {
                loadedUser = list.First<Uzivatel>();
            }

            return loadedUser;
        }

        public void delete(Uzivatel uzivatel)
        {
            initiateConnection();

            db.Uzivatel.Attach(uzivatel);
            db.Uzivatel.DeleteOnSubmit(uzivatel);

            db.SubmitChanges();

            closeConnection();
        }

        public List<Uzivatel> loadList(int odkud, int kolik)
        {
            initiateConnection();

            var result = from u in db.Uzivatel select u;

            List<Uzivatel> list = result.ToList<Uzivatel>();

            closeConnection();

            return list;
        }


        public void update(Uzivatel novy)
        {
            initiateConnection();

            uint id = novy.IDUzivatel;

            var updateQ = db.Uzivatel.First(e => e.IDUzivatel == id);

            updateQ.Jmeno = novy.Jmeno;
            updateQ.Prijmeni = novy.Prijmeni;
            updateQ.LoginUzivatel = novy.LoginUzivatel;
            //tady to bude chtit funkci na MD5 :]
            updateQ.LoginHesloHash = novy.LoginHesloHash;
            updateQ.PosledniZmenaHesla = novy.PosledniZmenaHesla;
            updateQ.Stav = novy.Stav;
            updateQ.Email = novy.Email;
            updateQ.Ulice = novy.Ulice;
            updateQ.Mesto = novy.Mesto;
            updateQ.Popisne = novy.Popisne;
            updateQ.PSC = novy.PSC;

            db.SubmitChanges();

            closeConnection();
        }


       public Uzivatel zkontrolujLogin(string login, string heslo, bool jeAdmin)
       {
           initiateConnection();
 
            var result = from u in db.Uzivatel
                         where u.LoginUzivatel == login
                         select new Uzivatel()
                         {
                             IDUzivatel = u.IDUzivatel,
                             Email = u.Email,
                             LoginUzivatel = u.LoginUzivatel,
                             LoginHesloHash = u.LoginHesloHash,
                             Jmeno = u.Jmeno,
                             Stav = u.Stav,
                             PosledniZmenaHesla = u.PosledniZmenaHesla,
                             Mesto = u.Mesto,
                             Ulice = u.Ulice,
                             Popisne = u.Popisne,
                             PSC = u.PSC,
                         };

           
          //pokud nenajde usera s danym loginem, pak je result null
            if (result == null || (result.ToList<Uzivatel>().Count<=0))
            {
                return (null);
            }
           
            Uzivatel uzivatel = result.First<Uzivatel>();
            
            closeConnection();

           //overit jestli heslo souhlasi
            string md5heslo = Util.Md5(heslo);

           //umele vytvoreny admin - login - admin, heslo - admin

           //tady ta podminka, je tu asi zbytecna, rek bych.. 
           if (md5heslo.Equals(uzivatel.LoginHesloHash) && uzivatel.LoginUzivatel.Equals("admin") && jeAdmin)
            {
                return (uzivatel);
            }

             if (md5heslo.Equals(uzivatel.LoginHesloHash))
            {
                return (uzivatel); //zavorky pro lukase :)
            }
            else
            {
                return (null);
            }
       }

       
    }
}